#include "MyShellGlobalVariables.h"

// 当前用户id
uid_t mysh::cur_uid = 0;

// 当前用户信息
struct passwd* mysh::cur_user_info = nullptr;

// 当前主机名
std::string mysh::cur_host_name = std::string();

// 资源管理器
mysh::ResourceManager* mysh::resource_manager = nullptr;

// mysh配置信息
myjson::JNode mysh::my_shell_configurations = myjson::JNode();

// 用于存储别名(或变量)的unordered_map
std::unordered_map<std::string, std::string> mysh::alias = std::unordered_map<std::string, std::string>();

// 用于存储内部命令的unordered_map
std::unordered_map<std::string, std::uint32_t> mysh::internal_commands = std::unordered_map<std::string, std::uint32_t>();

// 默认的跳过字符
char mysh::default_skip_char = ' ';

// 退出语句
std::unordered_map<std::uint32_t, std::string> mysh::exit_statement = {
    {0, "你要玩便痛快玩吧，何苦来招惹我。"},
    {1, "难为你费心，哪里就冷落死我了呢。"},
    {2, "这几升酒岂能醉我。"},
    {3, "莫愁前路无知己，天下谁人不识君。"},
};

// 是否退出主循环
bool mysh::if_break = false;

// 退出状态
std::uint32_t mysh::exit_status = 0;

// 当前命令是否是管道命令
bool mysh::if_pipe = false;

// 当前命令是否是赋值命令
bool mysh::if_alias = false;

// 当前命令是否需要输入重定向
bool mysh::if_input_redirection = false;

// 用于输入重定向的文件名
std::string mysh::file_to_input_redirection = std::string();

// 当前命令是否需要输出重定向
bool mysh::if_output_redirection = false;

// 用于输出重定向的文件名
std::string mysh::file_to_output_redirection = std::string();

// 当前进程是否处于后台运行
bool mysh::if_in_background = false;

// mysh路径
std::string mysh::mysh_path = std::string();

// 用于存储命令历史记录
std::vector<std::string> mysh::mysh_history_commands = std::vector<std::string>();

// 当前命令历史记录的索引
std::int32_t mysh::mysh_history_index = 0;

// 命令历史记录文件的文件名
std::string mysh::mysh_history_file_name = std::string();

// 命令历史记录最大能记录的数量
std::size_t mysh::mysh_history_max_size = 0;

// 配置文件文件名
std::string mysh::myshrc_file_name = std::string();

// 特殊路径
std::map<char, std::string> mysh::unique_path = std::map<char, std::string>();

// 外部命令存储路径
std::string mysh::external_commands_path = std::string();

// 用于存储外部命令的命令名
std::unordered_set<std::string> mysh::external_commands = std::unordered_set<std::string>();

// 外部命令字典树
myds::Trie* mysh::external_commands_trie = new myds::Trie();

// 系统命令存储路径
std::vector<std::string> mysh::system_commands_paths = std::vector<std::string>();

// 系统命令字典树
std::vector<myds::Trie*> mysh::system_commands_tries = std::vector<myds::Trie*>();

// 内部命令字典树
myds::Trie* mysh::internal_commands_trie = new myds::Trie();

// 刷新延时
std::uint64_t mysh::refresh_delay = 0;